package com.douma._2022;

import java.util.Scanner;

/**
 * 抖码算法，让算法学习变的简单有趣
 *
 * @作者 : 老汤
 */
public class IPv4地址转换成整数 {
    /*
    描述
    原理：ip地址的每段可以看成是一个0-255的整数，把每段拆分成一个二进制形式组合起来，然后把这个二进制数转变成
    一个长整数。
    举例：一个ip地址为10.0.3.193
    每段数字             相对应的二进制数
    10                   00001010
    0                    00000000
    3                    00000011
    193                  11000001

    组合起来即为：00001010 00000000 00000011 11000001,转换为10进制数就是：167773121，即该IP地址转换后的数字就是它了。

    数据范围：保证输入的是合法的 IP 序列

    输入描述：
    输入
    1 输入IP地址
    2 输入10进制型的IP地址

    输出描述：
    输出
    1 输出转换成10进制的IP地址
    2 输出转换后的IP地址

    示例1
    输入：
    10.0.3.193
    167969729
    复制
    输出：
    167773121
    10.3.3.193
     */



    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String str = in.next();
            String res = null;
            if (str.contains(".")) {
                res = ip2Num(str);
            } else {
                res = num2Ip(str);
            }
            System.out.println(res);
        }
    }

    /*  思路
    我们知道：
        2 进制的话，只有 0 和 1 两个数组
        8 进制的话，最小值是 9，最大值是 7，总共有 8 个数字
        10 进制的话，最小值是 0，最大值是 9，总共有 10 个数字

        因为 ip 中的每个数字的大小最小是 0，最大是 255，总共是 256 个，相当于是 256 进制

        那么 ip 10.0.3.193 中的 4 个数都是 256 进制的， 要把这个 ip 转成整数，
        相当于就是将四个 256 进制的数字，转成 10 进制，然后累加

        我们知道 2 进制转成 10 进制的方法，比如将二进制 1101 转成十进制是这样的：
        1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0

        那么将 10.0.3.193 中的 4 个 256 进制转成 10 进制，是这样的：
        10 * 256^3 + 0 * 256^2 + 3 * 256^1 + 193 * 256^0
     */
    private static String ip2Num(String ip) {
        String[] nums = ip.split("\\.");
        long res = 0;
        for (int i = 0; i < 4; i++) {
            res = res * 256 + Integer.parseInt(nums[i]);
        }
        return "" + res;
    }

    /*
    将整数转成 ip 就相当于：将一个 256 进制的整数，转成 4 个 10 进制的整数

    我们知道，将一个 10 进制的整数 (比如 13) 转成一个二进制的逻辑是：
    13 ➗ 2 = 6....1  ---> 得到一个 1
    6 ➗ 2 = 3....0  ----> 得到一个 0
    3 ➗ 2 = 1....1  ----> 得到一个 1
    1 ➗ 2 = 0....1  ----> 得到一个 1
    所以二进制是：1101

    同样，一个 10 进制的 167773121，转成 4 个 256 进制整数的逻辑就是：
    167773121 ➗ 256 = 655363 .... 193
    655363 ➗ 256 = 2560 .... 3
    2560 ➗ 256 = 10 .... 0
    10 ➗ 256 = 0 .... 10
    所以，ip 是：10.0.3.193
     */
    private static String num2Ip(String num) {
        long ip = Long.parseLong(num);
        String result = "";
        for (int i = 0; i < 4; i++) {
            result = ip % 256 + "." + result;
            ip /= 256;
        }
        return result.substring(0, result.length() - 1);
    }
}
